package test.action;

import m.common.action.Action;
import m.common.action.ActionRequest;
import m.common.action.RequestMethod;
import m.common.action.Param;
import m.server.web.req.FormData;
import m.server.web.res.ContentDisposition;
import m.server.web.res.ResponseByte;
import m.system.exception.MException;
import m.system.util.JSONMessage;
import test.service.InterService;
import test.model.UserInfo;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

/**
 * 定义应用的action
 */
//action所在包配置再mconfig.properties的action_pack里，包下的有@ActionRequest的类都属于action
//action访问规则：@ActionRequest的name+'/'+@RequestMethod的name结尾（未定义则为方法名称）
@ActionRequest(name="action/test/inter")
public class InterAction extends Action {
    private final InterService service=getService(InterService.class);


    /*
    参数自动填充：无论url参数，还是body参数（form-data,urlencoded,json）都支持填充
            --可填充基础数据类型，也可以填充list或map以及对象，必须存在setter方法
     */
    //参数名user.userName，可填充user对象的userName属性
    //如果时json传参,可将action当作一个json，
    // 例如：{"user":{"userName":""}}
    private UserInfo user;
    //参数名users[0].userName，可填充users第1个对象的userName属性
    //json传参 例如{"users":[{"userName":""}]}
    private List<UserInfo> users;
    //直接传参 num=1   json传参{"num":1}
    private Integer num;
    //form-data请求接收文件，参数名保持一直
    //文件可以用File接收（存在临时目录），也可以用FormData接收（接收成byte数组）
    //不用数组接收，传过来多个文件时，只填充一个
    //接收文件需要在@RequestMethod配置isFormData = true
    private File file;
    private FormData[] files;


    /*
    action方法：每个方法都可以接收请求，方法有参数，需@RequestMethod注解并配置params，和方法参数数量相同
            --方法返回则是输出内容，json返回推荐使用JSONMessage
            --方法可以抛异常，
     */

    //action测试1  访问方式路径为 action/test/inter/t1  返回json {"code":0,"msg":"t1 msg"}
    @RequestMethod
    public JSONMessage t1() throws Exception {
        service.save(user);
        return JSONMessage.success("t1 msg");
    }
    //action测试2  访问路径 action/test/inter/tt
    @RequestMethod(name = "tt",isFormData = true) //@RequestMethod定义访问方法名称，isFormData配置是否multipart/form-data请求
    //方法参数自动填充需要用@Param注解
    public JSONMessage t2(@Param("str1") String str1){
        return JSONMessage.success(str1)
            .push("user",user)
            .push("users",users)
            .push("num",num)
            .push("file",null!=file?file.getName():"no file");
    }
    //action测试3  异常测试 返回 "异常错误"
    @RequestMethod
    public Integer t3() throws Exception {
        throw new Exception("异常错误");
    }
    //action测试4  异常测试 返回{"code": 1,"msg": "异常错误"}
    //根据方法返回JSONMessage,将错误消息转换成json输出
    @RequestMethod
    public JSONMessage t4() throws Exception {
        throw new Exception("异常错误");
    }
    //action测试5  输出文件
    @RequestMethod
    public ResponseByte t5() throws MException, IOException {
        return new ResponseByte("文件内容123456".getBytes(), ContentDisposition.attachment("文件.txt"));
//        //也可以返回ResponseFile对象
//        return new ResponseFile(new File("文件路径"),ContentType.FILE,ContentDisposition.attachment("文件名.txt"))：
//        //返回字符串，使用getResponse()输出文件
//        getResponse().outFile(
//            new File("文件路径"),
//            ContentType.FILE, //输出的文件类型
//            ContentDisposition.attachment("下载名称.txt") //输出方式  Inline：打开，Attachment：下载
//        );
//        return "";
    }

    public UserInfo getUser() {
        return user;
    }

    public void setUser(UserInfo user) {
        this.user = user;
    }

    public List<UserInfo> getUsers() {
        return users;
    }

    public void setUsers(List<UserInfo> users) {
        this.users = users;
    }

    public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public FormData[] getFiles() {
        return files;
    }

    public void setFiles(FormData[] files) {
        this.files = files;
    }
}
